/**************基于51单片机的数字音乐盒***********/

#include <REGX52.H>	 //51单片机头文件  REGX52.H比 reg52.h的宏定义多一些！
#include "Tim.h"	 //定时器的头文件
#include "Delay.h"	 //延时函数
#include "LCD1602.h" //LCD1602液晶屏头文件
#include "Music.h"	 // 音乐
#include "Key.h"	 // 按键

/******变量-标志位******/
unsigned char Music_Mode = 0;		 // 模式--- 0 暂停(停止)，123分别代表第123首歌曲
unsigned char Music_Mode_Select = 0; // 模式选择按键
unsigned char FreqSelect, MusicSelect;

unsigned char keynum = 0;
unsigned int uwtick, key_tick;
unsigned char play_stop_flag = 0; // 0 stop - 1 play

/*******函数声明*******/
static void Key_Proc(void);			  // 按键扫描函数
static void LCD_Show_Proc(void);	  // LCD显示函数
void Select_MusicMode_Function(void); // 选择音乐模式函数

void main()
{
    LCD_Init();
	// 开机动画
	LCD_ShowString(1, 1, "  Music Player "); // 第一行第一列显示ABC
	LCD_ShowString(2, 1, "  Music OFF");	 // 开机默认显示 Music OFF
	
    Timer1_Init();
	Timer0_Init(); // 初始化默认停止计时，TR0 = 0;

	while (1)
	{
		keynum = Key_GetNum();
		Key_Proc();
		Select_MusicMode_Function();
		LCD_Show_Proc();
	}
}

/*******定时器0的中断服务子函数*******/
void Timer0_Isr(void) interrupt 1
{
	// 播放音乐的函数
	// 1ms进一次，2ms一周期，频率f=500Hz
	if (FreqTable[FreqSelect]) // 如果不是休止符
	{
		TL0 = FreqTable[FreqSelect] % 256; // 设置定时初值
		TH0 = FreqTable[FreqSelect] / 256; // 设置定时初值
		Buzzer = !Buzzer;				   // 翻转蜂鸣器IO口
	}
}

void Timer1_Isr(void) interrupt 3
{
	static unsigned int T1Count, key_scan;

	TL1 = 0x18; // 设置定时初始值
	TH1 = 0xFC; // 设置定时初始值
	uwtick++;
	if (uwtick >= 65530)
		uwtick = 0;

	if (++T1Count >= 1000)
	{
		T1Count = 0; // 清零重记次
	}
	if (++key_scan >= 20)
	{
		Key_Loop(); // 按键扫描
		key_scan = 0;
	}
}

/**********************函数部分**********************/
static void Key_Proc(void) // 按键扫描函数
{
	if (1 == keynum)
	{
		Music_Mode_Select++;
		if (Music_Mode_Select > 6) // 1-6
			Music_Mode_Select = 1;
		MusicSelect = 0;
	}
	else if (2 == keynum)
	{
		play_stop_flag = !play_stop_flag;
	}

	//	if (0 == KEY1) 	{Music_Mode_Select = 1;MusicSelect = 0; LCD_ShowString(2,1,"Music 1      ");}	//按键1按下，选择模式0，MusicSelect乐谱索引清零，LCD提示 Music 1
	//	if (0 == KEY2) 	{Music_Mode_Select = 2;MusicSelect = 0; LCD_ShowString(2,1,"Music 2      ");}
	//	if (0 == KEY3) 	{Music_Mode_Select = 3;MusicSelect = 0; LCD_ShowString(2,1,"Music 3      ");}
	//	if (0 == KEY4)	//按键4开始播放所选择的乐曲 左边的黄色按键，播放
	//	{
	//		Music_Mode = Music_Mode_Select;	//将当前选择的模式赋值给Music_Mode变量
	//		TR0 = 1;	//音乐开启
	//        LCD_ShowString(2,1,"Music play  ");
	//	}
	//	if (0 == KEY5)	//如果按键5按下，暂停功能
	//	{
	//        Music_Mode = 0;
	//        LCD_ShowString(2,1,"Music stop  ");
	//    }
}

static void LCD_Show_Proc(void)
{
	if (uwtick - key_tick < 1000) // 500ms
		return;
	key_tick = uwtick;

	if (play_stop_flag == 0) // stop
	{
		Music_Mode = 0;

		if (Music_Mode_Select == 1)
			LCD_ShowString(2, 1, "  Music 1 stop ");
		else if (Music_Mode_Select == 2)
			LCD_ShowString(2, 1, "  Music 2 stop ");
		else if (Music_Mode_Select == 3)
			LCD_ShowString(2, 1, "  Music 3 stop ");
		else if (Music_Mode_Select == 4)
			LCD_ShowString(2, 1, "  Music 4 stop ");
		else if (Music_Mode_Select == 5)
			LCD_ShowString(2, 1, "  Music 5 stop ");
		else if (Music_Mode_Select == 6)
			LCD_ShowString(2, 1, "  Music 6 stop ");
	}
	else if (play_stop_flag == 1) // play
	{
		Music_Mode = Music_Mode_Select; // 将当前选择的模式赋值给Music_Mode变量
		TR0 = 1;						// 音乐开启
		LCD_ShowString(2, 1, "  Music play   ");
	}
}

void Select_MusicMode_Function(void)
{
	if (0 == Music_Mode)
	{
		TR0 = 0; // 暂停计时
	}
	if (1 == Music_Mode) // 模式1 --- 歌曲1 --- 《花海》
	{
		if (Music_HuaHai[MusicSelect] != 0xFF) // 如果不是停止标志位
		{

			FreqSelect = Music_HuaHai[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Music_HuaHai[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0; // 清零Music_Mode变量，改变成模式0，代表暂停（停止）
							//				TR0=0;
							//				while(1);//播放完死循环
		}
	}

	if (2 == Music_Mode) // 模式2 --- 歌曲2 --- 《天空之城》
	{
		if (Music_Castle_in_the_Sky[MusicSelect] != 0xFF) // 如果不是停止标志位
		{
			FreqSelect = Music_Castle_in_the_Sky[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Music_Castle_in_the_Sky[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0;
		}
	}

	if (3 == Music_Mode) // 模式3 --- 歌曲3 --- 《勇气大爆发》
	{

		if (Music_3[MusicSelect] != 0xFF) // 如果不是停止标志位
		{

			FreqSelect = Music_3[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Music_3[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0;
		}
	}

	if (4 == Music_Mode) // 模式4 --- 歌曲4 --- 《勇气大爆发》
	{

		if (Auld_Lang_Syne[MusicSelect] != 0xFF) // 如果不是停止标志位
		{
			FreqSelect = Auld_Lang_Syne[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Auld_Lang_Syne[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0;
		}
	}

	if (5 == Music_Mode) // 模式4 --- 歌曲4 --- 《勇气大爆发》
	{

		if (Music_xiaoxingxing[MusicSelect] != 0xFF) // 如果不是停止标志位
		{
			FreqSelect = Music_xiaoxingxing[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Music_xiaoxingxing[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
	if (6 == Music_Mode) // 模式4 --- 歌曲4 --- 《勇气大爆发》
	{

		if (Music_Beijing[MusicSelect] != 0xFF) // 如果不是停止标志位
		{
			FreqSelect = Music_Beijing[MusicSelect]; // 选择音符对应的频率
			MusicSelect++;
			Delay((SPEED / 4) * Music_Beijing[MusicSelect]); // 十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0 = 0;
			Delay(5); // 音符间短暂停顿
			TR0 = 1;
		}
		else // 如果是停止标志位
		{
			Music_Mode = 0;
		}
	}
}
